[Manual] python3中selenium+phantom使用手册

这是一篇关于selenium和phantom在爬虫中的基础性文档

Posted by Leung ZhengHua on 2017-08-19

本文总点击量

在阅读本文之前,你可能对以下资源贴有兴趣:
Selenium with Python官方文档
Python爬虫利器五之Selenium的用法
用python玩转selenium
selenium和phantomjs爬取动态网页


导航

页面交互

仅仅打开一个网页对我们来说是没有什么价值的,我们使用selenium的目的在于和网页进行交互,做一些真实用户会做的操作,比如点击确定,和输入账号密码登陆。

文本框

比如,给定一段html代码如下:

1
<input type="text" name="passwd" id="passwd-id" />

这段代码块要求我们提交密码,要做两件事情,第一,定位到这一个页面元素(密码文本框),第二,对这个元素输入密码内容。我们可以这样获取它:

1
2
3
4
element = driver.find_element_by_id("passwd-id")
element = driver.find_element_by_name("passwd")
element = driver.find_elements_by_tag_name("input")
element = driver.find_element_by_xpath("//input[@id='passwd-id']")

如果有多个元素匹配了 xpath,它只会返回第一个匹配的元素。如果没有找到,那么会抛出 NoSuchElementException的异常。
当你得到了这个元素,你可以向它提交文本内容:

1
element.send_keys("some text")

又或者模拟点击某个按键。

1
element.send_keys("and some", Keys.ARROW_DOWN)

你可以对任何获取到到元素使用 send_keys 方法,就像你在 GMail 里面点击发送键一样。不过这样会导致的结果就是输入的文本不会自动清除。所以输入的文本都会在原来的基础上继续输入。你可以用下面的方法来清除输入文本的内容。

1
element.clear()

选择框

WebDriver提供了一个Select类,可以很好处理选择框的交互问题。

1
2
3
4
5
from selenium.webdriver.support.ui import Select
select = Select(driver.find_element_by_name('name'))
select.select_by_index(index)
select.select_by_visible_text("text")
select.select_by_value(value)

WebDriver也提供了取消选项的方法,下面举例取消全部选项;

1
2
select = Select(driver.find_element_by_id('id'))
select.deselect_all()

WebDriver也提供了返回全部选项内容的办法,下面举例得到全部选项:

1
2
3
select = Select(driver.find_element_by_xpath("xpath"))
all_selected_options = select.all_selected_options
options = select.options #得到全部选项

提交表单

当我们把表单填好,下一步就是点击确定(submit),提交表单内容。
方法一,找到Submit按钮,并调用Click()方法:

1
2
# Assume the button has the ID "submit" :)
driver.find_element_by_id("submit").click()

方法二,WebDriver 中每个元素都有Submit的方法可以调用,这表明可以单独提交某个元素。

1
element.submit()

WebDriver 会在表单中寻找它所在的表单,如果发现这个元素并没有被表单所包围,那么程序会抛出NoSuchElementException 的异常。

元素拖曳

要完成元素的拖拽,首先你需要指定被拖动的元素和拖动目标元素,然后利用 ActionChains 类来实现。

1
2
3
4
5
6
element = driver.find_element_by_name("source")
target = driver.find_element_by_name("target")
from selenium.webdriver import ActionChains
action_chains = ActionChains(driver)
action_chains.drag_and_drop(element, target).perform()

浏览窗口切换

弹窗处理

浏览历史

Cookies

Q & A

如何滚动窗口到页面底部?

你可以使用execute_script方法执行页面上的javascript 脚本,所以你可以滚动到页面底部或者到任意位置。

以下是一个滚动到页面底部的例子:

1
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

DOM中的window对象有一个scrollTo 方法,scrollHeight是所有元素的共同属性,document.body.scrollHeight给出了整个页面的高度值。

如何对当前窗口截图

使用webdriver提供的save_screenshot 方法:

1
2
3
4
5
6
from selenium import webdriver
driver = webdriver.Firefox()
driver.get('http://www.python.org/')
driver.save_screenshot('screenshot.png')
driver.quit()

如何上传文件

选择<input type="file">元素,然后在send_keys()中输入文件所在路径。